import java.util.ArrayList;  
import java.util.List;  
  
public class StringExtractor {  
  
    // 枚举类型表示状态机中的状态  
    private enum State {  
        NORMAL,  
        IN_STRING,  
        ESCAPE  
    }  
  
    // 方法：从源代码中提取所有字符串  
    public static List<String> extractStrings(String sourceCode) {  
        List<String> strings = new ArrayList<>();  
        StringBuilder currentString = new StringBuilder();  
        State state = State.NORMAL;  
  
        for (int i = 0; i < sourceCode.length(); i++) {  
            char ch = sourceCode.charAt(i);  
  
            if (state == State.NORMAL) {  
                if (ch == '"') {  
                    state = State.IN_STRING;  
                }  
                // 在NORMAL状态下，我们忽略其他字符  
            } else if (state == State.IN_STRING) {  
                if (ch == '"') {  
                    strings.add(currentString.toString());  
                    currentString.setLength(0); // 清空StringBuilder以准备下一个字符串  
                    state = State.NORMAL;  
                } else if (ch == '\\') {  
                    state = State.ESCAPE;  
                    // 注意：这里我们不立即处理转义字符，而是在下一个循环迭代中处理  
                } else {  
                    currentString.append(ch);  
                }  
            } else if (state == State.ESCAPE) {  
                // 处理转义字符，将其添加到当前字符串中  
                currentString.append(ch);  
                // 由于我们已经处理了转义字符，所以下一个字符将正常处理  
                // 因此，我们不需要在这里增加i的值，它将在循环的末尾自然增加  
                state = State.IN_STRING;  
            }  
        }  
  
        // 检查是否有不闭合的字符串  
        if (state == State.IN_STRING && currentString.length() > 0) {  
            throw new IllegalArgumentException("Unclosed string literal at the end of the input");  
        }  
  
        return strings;  
    }  
  
    public static void main(String[] args) {  
        String sourceCode = "char* example = \"一般学习一门编程语言的时候，基本上第一个程序是输出\\\"Hello World!\\\"\";\n" +  
                            "char* another_example = \"This is another \\\"string\\\" with an escape: \\\\n newline\";";  
  
        List<String> strings = extractStrings(sourceCode);  
        for (String str : strings) {  
            System.out.println(str);  
        }  
    }  
}